home *** CD-ROM | disk | FTP | other *** search
/ Nebula 1 / Nebula One.iso / Utilities / Unix / MOTD / Source / trimwtmp.c < prev   
C/C++ Source or Header  |  1995-06-12  |  2KB  |  76 lines

  1. /* Program: trimwtmp.c - Utility to prune Unix wtmp log files.
  2.  *
  3.  * Usage: trimwtmp [days] [wtmpfile]
  4.  *
  5.  * Defaults: 30 days "/usr/adm/wtmp"
  6.  *
  7.  * Compile: cc -o trimwtmp trimwtmp.c
  8.  *
  9.  * "mike" (Mike Macgirvin)         Mike_Macgirvin@MED.Stanford.EDU
  10.  * Unix Server Administrator       CAMIS Computer Project
  11.  *
  12.  * Modified for NeXT & ANSI-C by:
  13.  *
  14.  * Christopher Lane (Christopher_Lane@Med.Stanford.EDU)
  15.  * Symbolic Systems Resources Group, Knowledge Systems Laboratory
  16.  *
  17.  * Stanford University
  18.  */
  19.  
  20. #include <c.h>
  21. #include <libc.h>
  22. #include <utmp.h>
  23. #include <stdio.h>
  24. #include <stdlib.h>
  25. #include <sys/types.h>
  26.  
  27. #define TRIM_TIME 30
  28. #define PATH_WTMP "/usr/adm/wtmp"
  29. #define SECONDS_DAY (60 * 60 * 24)
  30.  
  31. typedef enum {PROGRAM = 0, DAYS, FILENAME, ARGC} ARGUMENTS;
  32.  
  33. void main(int argc, char *argv[])
  34. {
  35.     int days;
  36.     time_t when;
  37.     struct utmp ut;
  38.     FILE *fin, *fout;
  39.     char filename[MAXPATHLEN], temp_filename[MAXPATHLEN];
  40.   
  41.     if(argc > ARGC) {
  42.         (void) fprintf(stderr, "usage: %s [days] [wtmpfile]\n", argv[PROGRAM]);
  43.         exit(EXIT_FAILURE);
  44.         }
  45.         
  46.     (void) strcpy(filename, (argc > FILENAME) ? argv[FILENAME] : PATH_WTMP);
  47.  
  48.     if(argc <= DAYS || (days = atoi(argv[1])) <= 0) days = TRIM_TIME;
  49.     
  50.     when = time(NULL) - (days * SECONDS_DAY);
  51.     
  52.     (void) sprintf(temp_filename, "%s%d", filename, getpid());
  53. #ifdef DEBUG
  54.     (void) fprintf(stderr, "using \"%s\", \"%s\", trimming %d days\n", filename, temp_filename, days);
  55. #endif
  56.     if((fout = fopen(temp_filename, "w")) == NULL) {
  57.         (void) fprintf(stderr, "%s: Can't open temporary file for write: %s\n", argv[PROGRAM], temp_filename);
  58.         exit(EXIT_FAILURE);
  59.         }
  60.  
  61.     if((fin = fopen(filename, "r")) == NULL) {
  62.         (void) fprintf(stderr, "%s: Can't open wtmp file for read: %s\n", argv[PROGRAM], filename);
  63.         exit(EXIT_FAILURE);
  64.         }
  65.  
  66.     while(fread(&ut, sizeof(struct utmp), 1, fin) != 0)
  67.         if((time_t) ut.ut_time > when) (void) fwrite(&ut, sizeof(struct utmp), 1, fout);
  68.     
  69.     (void) fclose(fin);
  70.     (void) fclose(fout);
  71. #ifndef DEBUG
  72.     if(unlink(filename) != CERROR) (void) rename(temp_filename, filename);
  73. #endif
  74.     exit(EXIT_SUCCESS);
  75. }
  76.